home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / HELIOBAL.PRG < prev    next >
Encoding:
Text File  |  1997-11-27  |  42.8 KB  |  1,051 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // TITULO: HELIO BALL
  4. // AUTOR:  ANTONIO MARCHAL CORTÉS
  5. // FECHA:  07/07/97
  6. //------------------------------------------------------------------------------
  7.  
  8. PROGRAM helio_ball;
  9.  
  10. CONST
  11.     jugador1=1;     // Constantes de los tipos de jugador
  12.     jugador2=2;
  13.     ordenador1=3;
  14.     ordenador2=4;
  15.  
  16. GLOBAL
  17.     fichero1;       // Identificador a los gráficos del juego
  18.     fichero2;       // Identificador a los gráficos de los bonus
  19.     fichero3;       // Identificador a los gráficos del menu
  20.     idestadio;      // Identificador al gráfico del estadio
  21.     fuente1;        // Identificadores a las letras usadas
  22.     fuente2;
  23.     fuente3;
  24.     fuente4;
  25.     puntos1,puntos2;        // Puntuación de los jugadores
  26.     qjugador1=jugador1;     // Tipo de jugadores
  27.     qjugador2=jugador2;     // Por defecto jugador1 contra jugador 2
  28.     modojuego=0;            // Modo de juego (0=jugador1 contra jugador2
  29.                             //                1=ordenador1 contra jugador2
  30.                             //                2=jugador1 contra ordenador2
  31.                             //                3=ordenador1 contra ordenador2
  32.     tiempototal=60;         // Tiempo que dura el partido
  33.     tiempojuego;            // Tiempo que queda por jugar
  34.     idnave1;                // Identificadores a las naves
  35.     idnave2;
  36.     idpelota0;              // Identificador a la pelota
  37.     sibonus=0;              // Bandera. 1= Ya hay un bonus
  38.     tiempobonus=-1;         // Tiempo que lleva el bonus
  39.     contador;               // Contador de uso general
  40.  
  41.     idspuntos;              // Identificadores a los sonidos
  42.     idsgol;
  43.     idschoque1;
  44.     idschoque2;
  45.     idschoque3;
  46.  
  47. LOCAL
  48.     anguloreal;             // Angulo real de las naves
  49.     velocidadreal;          // Velocidad real de las naves
  50.     velocidadpelota;        // Velocidad real de la pelota
  51.     angulopelota;           // Angulo real de la pelota
  52.     increm_x;               // Necesario para el rebote de las naves
  53.     increm_y;
  54.     vel_inc_x=0;            // Incremento horizontal de la nave
  55.     vel_inc_y=0;            // Incremento vertical de la nave
  56.     cual;                   // Selecciona que tipo de nave es
  57.     vmaxima=2000;           // Velocidad máxima de las naves
  58.     fuerzaotra=0;           // Fuerza de empuje de mas en las naves
  59.     bonus=0;                // Bonus que ha recogido la nave
  60.     aceleración=400;        // aceleración de las naves
  61.     frenada=800;            // Frenada de las naves
  62.  
  63. PRIVATE
  64.     // Textos para las opciones
  65.     textojugador[]="-","TECLAS CURSOR","TECLAS Q-A-R-T","ORDENADOR 1","ORDENADOR 2";
  66.     textotiempo[]="-","060 SEGUNDOS","120 SEGUNDOS","180 SEGUNDOS","240 SEGUNDOS","300 SEGUNDOS";
  67.     idtexto1,idtexto2,idtexto3;     // Identificadores de los textos
  68.     tipotiempo=1;                   // Duración del partido
  69.     idfondo;                        // Identificador para poner los fondos
  70.     cuentaprorroga;                 // Contador para el texto de la prorroga
  71.     idprorroga;                     // Identificador del texto de prorroga
  72.     idsmenu;                        // Identificadores a sonido
  73.     idsinicio;
  74.     idsfinal;
  75.     boton_aceptar=0;                // Comprueba si se eligio una opción del menú
  76. BEGIN
  77.     set_mode(m640x480);             // Selecciona el modo de vídeo
  78.     max_process_time=1000;          // Se pone que abarque mas para equipos lentos
  79.  
  80.     // Carga los ficheros de los gráficos
  81.     fichero1=load_fpg("heliobal\naves.fpg");
  82.     fichero2=load_fpg("heliobal\items.fpg");
  83.     fichero3=load_fpg("heliobal\menu.fpg");
  84.  
  85.     // Carga las letras necesarias
  86.     fuente1=load_fnt("heliobal\digital0.fnt");
  87.     fuente2=load_fnt("heliobal\digital1.fnt");
  88.     fuente3=load_fnt("heliobal\digital.fnt");
  89.     fuente4=load_fnt("heliobal\digital2.fnt");
  90.  
  91.     // Carga los sonidos
  92.     idspuntos=load_pcm("heliobal\bonus.pcm",0);
  93.     idsgol=load_pcm("heliobal\goal.pcm",0);
  94.     idschoque1=load_pcm("heliobal\choque1.pcm",0);
  95.     idschoque2=load_pcm("heliobal\valla.pcm",0);
  96.     idschoque3=load_pcm("heliobal\choque2.pcm",0);
  97.  
  98.     // Inicialmente es ordenador contra ordenador
  99.     modojuego=3;
  100.     qjugador1=3;
  101.     qjugador2=4;
  102.  
  103.     WHILE (NOT key(_esc))
  104.  
  105.         // Carga el sonido y la pantalla con la paleta iniciales
  106.         idsmenu=load_pcm("heliobal\menu.pcm",0);
  107.         idfondo=load_map("heliobal\cartel.map");
  108.         load_pal("heliobal\cartel.map");
  109.         put_screen(0,idfondo);          // Pone la pantalla
  110.         fade_on();                      // Enciende la pantalla y hace el sonido
  111.         sound(idsmenu,75,256);
  112.         WHILE (scan_code==0 AND NOT mouse.left)
  113.             FRAME;
  114.         END                             // Espera a que se pulse 'espacio' o 'escape'
  115.         IF (key(_esc))                  // Si se ha pulsado 'escape' sale del programa
  116.             fade_off();
  117.             creditos();
  118.             FRAME;
  119.         END
  120.         fade_off();                     // Apaga la pantalla
  121.         unload_pcm(idsmenu);            // Y descarga el sonido para tener mas pantalla
  122.         unload_map(idfondo);
  123.         idfondo=load_map("heliobal\ciudad.map");
  124.         load_pal("heliobal\ciudad.map");
  125.  
  126.         // Pone la pantalla de fondo y escribe los mensajes
  127.         put_screen(0,idfondo);
  128.         idtexto1=write(fuente1,320,37,4,textojugador[qjugador1]);
  129.         write(fuente1,320,87,4,"CONTRA");
  130.         idtexto2=write(fuente1,320,137,4,textojugador[qjugador2]);
  131.         write(fuente1,320,237,4,"TIEMPO");
  132.         idtexto3=write(fuente1,320,287,4,textotiempo[tipotiempo]);
  133.  
  134.         // Crea las barras del menu
  135.         barra_menu(320,40,997,fichero3,0,5);
  136.         barra_menu(320,40,995,fichero3,4,10);
  137.         barra_menu(320,140,997,fichero3,0,5);
  138.         barra_menu(320,140,995,fichero3,4,10);
  139.         barra_menu(320,290,998,fichero3,0,5);
  140.         barra_menu(320,290,996,fichero3,4,10);
  141.         barra_menu(320,450,994,fichero3,0,5);
  142.         barra_menu(320,450,993,fichero3,4,10);
  143.  
  144.  
  145.         // Asignamos el gráfico del ratón
  146.         mouse.graph=999;mouse.file=fichero3;
  147.         fade_on();                      // Enciende la pantalla
  148.         boton_aceptar=0;                // Reinicia variable de comprobación
  149.         WHILE (boton_aceptar==0 AND NOT key(_esc))
  150.             // Comprueba si esta pulsado el ratón y en que posición
  151.             IF (mouse.x>20 AND mouse.x<620 AND
  152.                 mouse.y>12 AND mouse.y<68
  153.                 AND mouse.left)         // Cambia el tipo de jugador de la izquierda
  154.                 WHILE(mouse.left) FRAME; END   // Espera a que se suelte el ratón
  155.                 delete_text(idtexto1);  // Borra el texto antiguo
  156.                 IF (qjugador1==1)
  157.                     qjugador1=3;        // Ordenador
  158.                 ELSE
  159.                     qjugador1=1;        // Humano
  160.                 END
  161.                 // Pone el texto nuevo
  162.                 idtexto1=write(fuente1,320,37,4,textojugador[qjugador1]);
  163.             END
  164.             // Comprueba si esta pulsado el ratón y en que posición
  165.             IF (mouse.x>20 AND mouse.x<620 AND
  166.                 mouse.y>112 AND mouse.y<168
  167.                 AND mouse.left)         // Cambia el tipo de jugador de la derecha
  168.                 WHILE(mouse.left) FRAME; END   // Espera a que se suelte el ratón
  169.                 delete_text(idtexto2);  // Borra el texto antiguo
  170.                 IF (qjugador2==2)
  171.                     qjugador2=4;        // Ordenador
  172.                 ELSE
  173.                     qjugador2=2;        // Humano
  174.                 END
  175.                 // Pone el texto nuevo
  176.                 idtexto2=write(fuente1,320,137,4,textojugador[qjugador2]);
  177.             END
  178.             // Comprueba si esta pulsado el ratón y en que posición
  179.             IF (mouse.x>113 AND mouse.x<527 AND
  180.                 mouse.y>262 AND mouse.y<318
  181.                 AND mouse.left)         // Cambia la duración del partido
  182.                 WHILE(mouse.left) FRAME; END   // Espera a que se suelte el ratón
  183.                 delete_text(idtexto3);  // Borra el texto antiguo
  184.                 tipotiempo++;
  185.                 IF (tipotiempo>5) tipotiempo=1; END
  186.                 // Pone el texto nuevo
  187.                 idtexto3=write(fuente1,320,287,4,textotiempo[tipotiempo]);
  188.             END
  189.             // Comprueba si esta pulsado el ratón y en que posición
  190.             IF (mouse.x>202 AND mouse.x<438 AND
  191.                 mouse.y>422 AND mouse.y<478
  192.                 AND mouse.left)         // Mira si se pulsa el botón de aceptar
  193.                 WHILE(mouse.left) FRAME; END   // Espera a que se suelte el ratón
  194.                 boton_aceptar=1;
  195.             END
  196.             tiempototal=tipotiempo*60;  // Reinicializa el tiempo
  197.             // Selecciona el modo de juego dependiendo del tipo de jugador
  198.             IF (qjugador1==1)
  199.                 IF (qjugador2==2) modojuego=0; ELSE modojuego=1; END
  200.             ELSE
  201.                 IF (qjugador2==2) modojuego=2; ELSE modojuego=3; END
  202.             END
  203.             FRAME;
  204.         END
  205.  
  206.         // Quitamos el gráfico del ratón
  207.         mouse.graph=0;
  208.         IF (key(_esc))  // Si se ha pulsado 'escape' sal del programa
  209.             fade_off();
  210.             creditos();
  211.             FRAME;
  212.         END
  213.         fade_off();
  214.         unload_map(idfondo);    // Descarga la pantalla de fondo por la memoria
  215.  
  216.         // Carga el gráfico del estadio y su paleta
  217.         idestadio=load_map("heliobal\estadio.map");
  218.         load_pal("heliobal\naves.fpg");
  219.         delete_text(all_text);  // Borra cualquier texto
  220.  
  221.         // Eliminamos cualquier proceso
  222.         let_me_alone();
  223.         clear_screen();
  224.         iniciacampo();          // Reinicializa campo
  225.         fade_on();
  226.  
  227.         // Pone los puntos y el tiempo a cero
  228.         timer[0]=0; puntos1=0; puntos2=0;
  229.         tiempojuego=tiempototal-(timer[0]/100);
  230.  
  231.         // Escribe los texto de los marcadores
  232.         write_int(fuente3,147,-2,2,&puntos1);
  233.         write_int(fuente3,636,-2,2,&puntos2);
  234.         write_int(fuente3,356,-2,2,&tiempojuego);
  235.         marcadores();   // Pone los fondos de los marcadores
  236.  
  237.         // Carga sonido del inicio del juego
  238.         idsinicio=load_pcm("heliobal\inigame.pcm",0);
  239.         sound(idsinicio,75,256);    // Haz sonido de inicio
  240.  
  241.         // Repite hasta que se acabe el tiempo
  242.         WHILE (NOT key(_esc) AND tiempojuego>=0)
  243.  
  244.             // Si hay empate suma 30 segundos mas de prorroga
  245.             IF (tiempojuego<1 AND puntos1==puntos2)
  246.                 timer[0]=0;
  247.                 tiempototal=30;
  248.                 cuentaprorroga=30;
  249.             END
  250.  
  251.             // Normaliza el tiempo de juego para no imprimir negativos
  252.             IF (tiempojuego<0) tiempojuego=0; END
  253.             IF (cuentaprorroga>0) // Si ha habido prorroga por el texto
  254.                 idprorroga=write(fuente2,320,280,4,"PRORROGA!");
  255.             END
  256.  
  257.             FRAME;
  258.  
  259.             // Actualiza el tiempo que queda de juego
  260.             tiempojuego=tiempototal-(timer[0]/100);
  261.  
  262.             // Pone los objetos de bonus
  263.             IF (rand(0,10)==0 AND idnave1.bonus==0 AND idnave2.bonus==0 AND sibonus==0)
  264.                 objetos();
  265.             END
  266.  
  267.             // Si esta el puesto el texto de prorroga lo quita
  268.             IF (cuentaprorroga>0)
  269.                 cuentaprorroga--;
  270.                 delete_text(idprorroga);
  271.             END
  272.         END
  273.  
  274.         // Descarga el sonido por motivos de memoria
  275.         unload_pcm(idsinicio);
  276.  
  277.         // Para los procesos de las naves y la pelota
  278.         signal(idnave1,s_freeze);
  279.         signal(idnave2,s_freeze);
  280.         signal(idpelota0,s_freeze);
  281.  
  282.         // Carga el sonido de final de partido
  283.         idsfinal=load_pcm("heliobal\timeout.pcm",0);
  284.         IF (tiempojuego<1)
  285.             idsfinal=load_pcm("heliobal\timeout.pcm",0);
  286.             tiempojuego=0;
  287.             contador=0;
  288.             write(fuente2,320,280,4,"FINAL DE PARTIDO!");
  289.             sound(idsfinal,75,256);
  290.             // Espera hasta que se pulsa la barra espaciadora o pasa un tiempo
  291.             WHILE (NOT key(_space) AND contador<30)
  292.                 FRAME;
  293.                 contador++;
  294.             END
  295.             unload_pcm(idsfinal);
  296.         END
  297.         // Apaga la pantalla
  298.         fade_off();
  299.         // Borra todos los textos y procesos
  300.         delete_text(all_text);
  301.         let_me_alone();
  302.         // Elimina los movimientos de pantalla (scrolles)
  303.         stop_scroll(0);stop_scroll(1);
  304.    END
  305. END
  306.  
  307. //------------------------------------------------------------------------------
  308. // Proceso pelota
  309. // Controla la pelota
  310. //------------------------------------------------------------------------------
  311.  
  312. PROCESS pelota()
  313.  
  314. PRIVATE
  315.     idnave;             // Identificador de las naves
  316.     sumaangx,sumaangy;  // Usados para sumar ángulos
  317.     angx,angy;
  318.     vel_real;           // Para uso temporal guarda la velocidad real
  319.     ultix,ultiy;        // Ultimas coordenadas del objeto
  320.  
  321. BEGIN
  322.     ctype=c_scroll;     // Introduce al proceso dentro del scroll
  323.     graph=50;           // Elige el gráfico y las coordenadas iniciales
  324.     x=640;
  325.     y=rand(400,560);
  326.     ultix=x;ultiy=y;    // Inicializa el gráfico
  327.     LOOP
  328.         // Mueve la pelota
  329.         x+=get_distx(angulopelota,velocidadpelota/200);
  330.         y+=get_disty(angulopelota,velocidadpelota/200);
  331.  
  332.         // Frena la pelota
  333.         IF (velocidadpelota>0)
  334.             velocidadpelota-=100;
  335.         ELSE
  336.             velocidadpelota=0;
  337.         END
  338.  
  339.         // Detecta si ha tocado a la nave
  340.         IF (idnave=collision(TYPE nave))
  341.             sound(idschoque3,rand(5,50),256);   // Hace sonido
  342.  
  343.             // Coge la velocidad de la nave mas un incremento
  344.             velocidadpelota=(idnave.velocidadreal)+1200;
  345.  
  346.             // Mira si la nave es controlada por el jugador
  347.             IF (idnave.cual==jugador1 OR idnave.cual==jugador2)
  348.                 vel_real=idnave.velocidadreal;
  349.                 IF (vel_real>400) vel_real=400; END
  350.  
  351.                 // Suma el ángulo que lleva la nave con el que
  352.                 // forman la pelota y la nave
  353.                 sumaangx=get_distx(get_angle(idnave)+180000,400);
  354.                 sumaangy=get_disty(get_angle(idnave)+180000,400);
  355.                 angx=get_distx(idnave.anguloreal,vel_real);
  356.                 angy=get_disty(idnave.anguloreal,vel_real);
  357.                 sumaangx+=angx; sumaangy+=angy;
  358.  
  359.                 // Mueve la pelota y actualiza el ángulo
  360.                 angulopelota=fget_angle(0,0,sumaangx,sumaangy);
  361.                 x+=get_distx(angulopelota,velocidadpelota/200);
  362.                 y+=get_disty(angulopelota,velocidadpelota/200);
  363.             ELSE        // O controlada por el ordenador
  364.                 angulopelota=(get_angle(idnave)+180000) mod 360000;
  365.             END
  366.         END
  367.  
  368.         // Comprueba si rebota con las paredes superior e inferior
  369.         IF (y<195 OR y>758)
  370.             angulopelota=(fget_angle(0,0,(get_distx(angulopelota,200)),-(get_disty(angulopelota,200))));
  371.             velocidadpelota+=100;
  372.             x+=get_distx(angulopelota,velocidadpelota/200);
  373.             y+=get_disty(angulopelota,velocidadpelota/200);
  374.             IF (y<195) y=196; END
  375.             IF (y>758) y=757; END
  376.         END
  377.  
  378.         // Comprueba si esta en los lados derecho o izquierdo del campo
  379.         IF (x<131 OR x>1069)
  380.             // Comprueba si estaba dentro de la portería
  381.             IF  (ultiy=>400 AND ultiy<=544)
  382.                // Comprueba el rebote con los laterales de la portería
  383.                IF (y<400 OR y>544)
  384.                     angulopelota=(fget_angle(0,0,(get_distx(angulopelota,200)),-(get_disty(angulopelota,200))));
  385.                     velocidadpelota+=100;
  386.                     x+=get_distx(angulopelota,velocidadpelota/200);
  387.                     y+=get_disty(angulopelota,velocidadpelota/200);
  388.                     IF (y<400) y=401; END
  389.                     IF (y>544) y=543; END
  390.                END
  391.                // Comprueba si se ha metido gol
  392.                IF (x<75 OR x>1126)
  393.                    IF (x<76) puntos2+=50; ELSE puntos1+=50; END
  394.                    golmarcado();    // Se ha metido gol
  395.                END
  396.         ELSE
  397.             // Realiza el rebote con los laterales derecho o izquierdo del campo
  398.             angulopelota=(fget_angle(0,0,-(get_distx(angulopelota,200)),(get_disty(angulopelota,200))));
  399.             velocidadpelota+=100;
  400.             x+=get_distx(angulopelota,velocidadpelota/200);
  401.             y+=get_disty(angulopelota,velocidadpelota/200);
  402.             IF (x<131) x=132; END
  403.             IF (x>1069) x=1068; END
  404.            END
  405.         END
  406.         FRAME(50);
  407.         ultix=x;ultiy=y;    // Se guarda para la comprobaciones con la portería
  408.     END
  409. END
  410.  
  411. //------------------------------------------------------------------------------
  412. // Proceso nave
  413. // Controla las naves de los jugadores
  414. //------------------------------------------------------------------------------
  415.  
  416. PROCESS nave(cual)
  417.  
  418. PRIVATE
  419.     marco;                  // Variable para sacar el ángulo de la nave
  420.     idnave;                 // Identificador de la otra nave
  421.     tvelocidad0;            // Suma de las velocidades de las naves antes de chocar
  422.     tvelocidad1;            // Suma de las velocidades de las naves después de chocar
  423.     anguloa;                // Angulo entre las naves
  424.     suma_veloc_x,suma_veloc_y;  // Suma de los incrementos x e y de las naves
  425.     tdistancia;             // Distancia entre las dos naves
  426.     idbola;                 // Identificador de la pelota
  427.     inigraph;               // Gráfico inicial de las naves
  428.     angulografico;          // Angulo al que tienden los gráficos de las naves
  429.     angulofinalg;           // Angulo de los gráficos de las naves
  430.     sumaangx,sumaangy;      // Suma de los ángulos de las naves y los formados
  431.     angx,angy;              // por la pelota y la nave
  432.     vel_real;               // Variable temporal para truncar la velocidad
  433.     ultix,ultiy;            // Ultima posición de las naves
  434.     posxpelota,posypelota;  // Posición de donde deben ir las naves controladas por el ordenador
  435. BEGIN
  436.     ctype=c_scroll;         // Introduce al proceso dentro del scroll
  437.     sombra();               // Pone la sombra
  438.  
  439.     // Pone la posición, los gráficos y el ángulo iniciales de las naves
  440.     IF (cual==jugador1 OR cual==ordenador1)
  441.         graph=1; inigraph=1;
  442.         x=580; y=480;
  443.         angle=0;
  444.     ELSE
  445.         graph=25; inigraph=25;
  446.         x=700; y=480;
  447.         angle=180000;
  448.     END
  449.     ultix=x; ultiy=y;   // Guarda la última posición de la nave
  450.     LOOP
  451.         // Maneja el control de la nave dependiendo del tipo de jugador
  452.         SWITCH (cual)
  453.             CASE 1:         // Lee el teclado del jugador 1
  454.                 IF (key(_right))
  455.                     IF (vel_inc_x>=0) vel_inc_x+=aceleración; ELSE vel_inc_x+=frenada; END
  456.                 END
  457.                 IF (key(_left))
  458.                     IF (vel_inc_x<=0) vel_inc_x-=aceleración; ELSE vel_inc_x-=frenada; END
  459.                 END
  460.                 IF (key(_up))
  461.                     IF (vel_inc_y<=0) vel_inc_y-=aceleración; ELSE vel_inc_y-=frenada; END
  462.                 END
  463.                 IF (key(_down))
  464.                     IF (vel_inc_y>=0) vel_inc_y+=aceleración; ELSE vel_inc_y+=frenada; END
  465.                 END
  466.             END
  467.             CASE 2:         // Lee el teclado del jugador 2
  468.                 IF (key(_t))
  469.                     IF (vel_inc_x>=0) vel_inc_x+=aceleración; ELSE vel_inc_x+=frenada; END
  470.                 END
  471.                 IF (key(_r))
  472.                     IF (vel_inc_x<=0) vel_inc_x-=aceleración; ELSE vel_inc_x-=frenada; END
  473.                 END
  474.                 IF (key(_q))
  475.                     IF (vel_inc_y<=0) vel_inc_y-=aceleración; ELSE vel_inc_y-=frenada; END
  476.                 END
  477.                 IF (key(_a))
  478.                     IF (vel_inc_y>=0) vel_inc_y+=aceleración; ELSE vel_inc_y+=frenada; END
  479.                 END
  480.             END
  481.             CASE 3:         // Inteligencia del ordenador 1
  482.                 posxpelota=idpelota0.x+(get_distx(fget_angle(1130,480,idpelota0.x,idpelota0.y),25));
  483.                 posypelota=idpelota0.y+(get_disty(fget_angle(1130,480,idpelota0.x,idpelota0.y),25));
  484.                 anguloreal=near_angle(anguloreal,fget_angle(x,y,posxpelota,posypelota),15000);
  485.                 velocidadreal+=100;
  486.                 vel_inc_x=get_distx(anguloreal,velocidadreal);
  487.                 vel_inc_y=get_disty(anguloreal,velocidadreal);
  488.             END
  489.             CASE 4:         // Inteligencia del ordenador 2
  490.                 posxpelota=idpelota0.x+(get_distx(fget_angle(80,480,idpelota0.x,idpelota0.y),25));
  491.                 posypelota=idpelota0.y+(get_disty(fget_angle(80,480,idpelota0.x,idpelota0.y),25));
  492.                 anguloreal=near_angle(anguloreal, fget_angle(x,y,posxpelota,posypelota),15000);
  493.                 velocidadreal+=100;
  494.                 vel_inc_x=get_distx(anguloreal,velocidadreal);
  495.                 vel_inc_y=get_disty(anguloreal,velocidadreal);
  496.             END
  497.         END
  498.  
  499.         // Mueve la nave
  500.         x+=(vel_inc_x/200);
  501.         y+=(vel_inc_y/200);
  502.  
  503.         // Y la frena un poco
  504.         IF (vel_inc_x>0) vel_inc_x-=40; END
  505.         IF (vel_inc_y>0) vel_inc_y-=40; END
  506.         IF (vel_inc_x<0) vel_inc_x+=40; END
  507.         IF (vel_inc_y<0) vel_inc_y+=40; END
  508.  
  509.         // Trunca la velocidad con la velocidad máxima
  510.         IF (fget_dist(0,0,vel_inc_x,vel_inc_y)>vmaxima)
  511.             // Lo hace de manera circular
  512.             marco=fget_angle(0,0,vel_inc_x,vel_inc_y);
  513.             vel_inc_x=get_distx(marco,vmaxima);
  514.             vel_inc_y=get_disty(marco,vmaxima);
  515.         END
  516.  
  517.         // Comprueba el choque entre las naves
  518.         IF ((idnave=collision(TYPE nave)) AND id<>idnave)
  519.  
  520.             // Realiza un sonido y pone una explosión entre las dos naves
  521.             sound(idschoque1,rand(15,65),256);
  522.             explosión(x+get_distx(get_angle(idnave),get_dist(idnave)/2),y+get_disty(get_angle(idnave),get_dist(idnave)/2));
  523.  
  524.             // Actualiza las variables de ángulo y velocidad de las naves
  525.             anguloreal=fget_angle(0,0,vel_inc_x,vel_inc_y);
  526.             velocidadreal=fget_dist(0,0,vel_inc_x,vel_inc_y);
  527.             idnave.anguloreal=fget_angle(0,0,idnave.vel_inc_x,idnave.vel_inc_y);
  528.             idnave.velocidadreal=fget_dist(0,0,idnave.vel_inc_x,idnave.vel_inc_y);
  529.  
  530.             // Incrementa las velocidad por el choque y las sumas
  531.             velocidadreal+=100;idnave.velocidadreal+=100;
  532.             tvelocidad0=velocidadreal+idnave.velocidadreal;
  533.  
  534.             // Haya el ángulo entre las naves
  535.             anguloa=get_angle(idnave);
  536.  
  537.             // Calcula los incrementos verticales y horizontales
  538.             increm_x=get_distx(anguloreal,velocidadreal);
  539.             increm_y=get_disty(anguloreal,velocidadreal);
  540.             idnave.increm_x=get_distx(idnave.anguloreal,idnave.velocidadreal);
  541.             idnave.increm_y=get_disty(idnave.anguloreal,idnave.velocidadreal);
  542.  
  543.             // Y sumas los incrementos(= ángulos de las naves)
  544.             suma_veloc_x=increm_x+idnave.increm_x; suma_veloc_y=increm_y+idnave.increm_y;
  545.             tdistancia=fget_dist(0,0,suma_veloc_x,suma_veloc_y);
  546.  
  547.             // A una nave se la manda en una dirección
  548.             increm_x-=get_distx(anguloa,tdistancia);
  549.             increm_y-=get_disty(anguloa,tdistancia);
  550.  
  551.             // Y a la otra en la dirección contraria
  552.             idnave.increm_x+=get_distx(anguloa,tdistancia);
  553.             idnave.increm_y+=get_disty(anguloa,tdistancia);
  554.  
  555.             // Se actualiza las variables de ángulo y velocidad
  556.             anguloreal=fget_angle(0,0,increm_x,increm_y);
  557.             velocidadreal=fget_dist(0,0,increm_x,increm_y);
  558.             idnave.anguloreal=fget_angle(0,0,idnave.increm_x,idnave.increm_y);
  559.             idnave.velocidadreal=fget_dist(0,0,idnave.increm_x,idnave.increm_y);
  560.  
  561.             // Y se iguala a las velocidades iniciales
  562.             tvelocidad1=velocidadreal+idnave.velocidadreal;
  563.             IF (tvelocidad1==0) tvelocidad1=1; END
  564.  
  565.             // Se actualiza las velocidades de las naves
  566.             velocidadreal=tvelocidad0*velocidadreal/tvelocidad1;
  567.             idnave.velocidadreal=tvelocidad0*idnave.velocidadreal/tvelocidad1;
  568.  
  569.             // Y se suma un incremento si la otra nave tiene el icono de fuerza
  570.             velocidadreal+=idnave.fuerzaotra;
  571.             idnave.velocidadreal+=fuerzaotra;
  572.  
  573.             // Se actualiza los incrementos vertical y horizontal
  574.             vel_inc_x=get_distx(anguloreal,velocidadreal);
  575.             vel_inc_y=get_disty(anguloreal,velocidadreal);
  576.             idnave.vel_inc_x=get_distx(idnave.anguloreal,idnave.velocidadreal);
  577.             idnave.vel_inc_y=get_disty(idnave.anguloreal,idnave.velocidadreal);
  578.         END
  579.  
  580.         // Se actualizan la velocidad y el ángulo de las naves según los incrementos
  581.         anguloreal=fget_angle(0,0,vel_inc_x,vel_inc_y);
  582.         velocidadreal=fget_dist(0,0,vel_inc_x,vel_inc_y);
  583.  
  584.         // Si la nave se mueve, se va girando el gráfico hacia su verdadera dirección
  585.         IF (velocidadreal>200)
  586.             angle=near_angle(angle,anguloreal,10000);
  587.             angulografico=anguloreal-angle;
  588.             angulofinalg=near_angle(angulofinalg,angulografico,15000);
  589.             WHILE (angulofinalg<0) angulofinalg+=360000; END
  590.             WHILE (angulofinalg>=360000) angulofinalg-=360000; END
  591.             graph=inigraph+(angulofinalg/15000);
  592.         END
  593.  
  594.         // Se comprueba si se ha chocado con la pelota
  595.         IF (idbola=collision(TYPE pelota))
  596.  
  597.             // Se realiza un sonido
  598.             sound(idschoque3,rand(5,50),256);
  599.  
  600.             // Y se incrementa la velocidad de la pelota según la de la nave
  601.             idbola.velocidadpelota=velocidadreal+1200;
  602.  
  603.             // Se comprueba si la ha tocado el jugador o el ordenador
  604.             IF (cual==jugador1 OR cual==jugador2)
  605.  
  606.                 // Si es el jugador se halla la suma de los ángulos
  607.                 // de la dirección de la nave y el ángulo formado entre ambos
  608.                 vel_real=velocidadreal;
  609.                 IF (vel_real>400) vel_real=400; END
  610.                 sumaangx=get_distx((get_angle(idbola)),400);
  611.                 sumaangy=get_disty((get_angle(idbola)),400);
  612.                 angx=get_distx(anguloreal,vel_real);
  613.                 angy=get_disty(anguloreal,vel_real);
  614.                 sumaangx+=angx; sumaangy+=angy;
  615.                 idbola.angulopelota=fget_angle(0,0,sumaangx,sumaangy);
  616.             ELSE
  617.                 // Si es el ordenador se coge el ángulo entre ambos
  618.                 idbola.angulopelota=get_angle(idbola);
  619.             END
  620.         END
  621.  
  622.         // Comprueba el rebote con el borde superior o inferior
  623.         IF (y<219 OR y>733)
  624.             sound(idschoque2,rand(5,50),256);
  625.             vel_inc_y=-vel_inc_y;
  626.             IF (y<219) y=220; explosión(x,y-25); END
  627.             IF (y>733) y=732; explosión(x,y+25); END
  628.         END
  629.  
  630.         // Se comprueba si esta en los laterales
  631.         IF (x<154 OR x>1046)
  632.             // Se comprueba si estaba dentro de la portería
  633.             IF  (ultiy=>425 AND ultiy<=531)
  634.  
  635.                 // Se chequea si choca con los bordes de la portería
  636.                 IF (y<425 OR y>526)
  637.                     sound(idschoque2,rand(5,50),256);
  638.                     vel_inc_y=-vel_inc_y;
  639.                     IF (y<425) y=426; explosión(x,y-25); END
  640.                     IF (y>526) y=525; explosión(x,y+25); END
  641.                 END
  642.  
  643.                 // Se comprueba si choca con el fondo de la portería
  644.                 IF (x<80 OR x>1120)
  645.                     sound(idschoque2,rand(5,50),256);
  646.                     vel_inc_x=-vel_inc_x;
  647.                     IF (x<80) x=81; explosión(x-25,y); END
  648.                     IF (x>1120) x=1119; explosión(x+25,y); END
  649.                 END
  650.             ELSE
  651.  
  652.                 // Esta chocando con los laterales del campo
  653.                 vel_inc_x=-vel_inc_x;
  654.                 sound(idschoque2,rand(5,50),256);
  655.                 IF (x<154) x=155; explosión(x-25,y); END
  656.                 IF (x>1046) x=1045; explosión(x+25,y); END
  657.            END
  658.         END
  659.  
  660.         FRAME(50);
  661.         ultix=x; ultiy=y;
  662.     END
  663. END
  664.  
  665. //------------------------------------------------------------------------------
  666. // Proceso golmarcado
  667. // Maneja los goles marcados
  668. //------------------------------------------------------------------------------
  669.  
  670. PROCESS golmarcado()
  671.  
  672. PRIVATE
  673.     idtexto;        // Identificador del texto 'gooool'
  674.  
  675. BEGIN
  676.     sound(idsgol,75,256);                       // Realiza el sonido
  677.     signal(TYPE pelota,s_freeze);               // Para los procesos de la pelota
  678.     signal(TYPE nave,s_freeze);                 // Y las naves
  679.     idtexto=write(fuente2,320,240,4,"GOOOOL!"); // Pone el texto 'GOOOOL!'
  680.     contador=0;
  681.     WHILE (contador<10 AND NOT key(_space))     // Espera un tiempo o la pulsación de espacio
  682.         contador++;
  683.         FRAME;
  684.     END
  685.     fade_off();
  686.     signal(TYPE pelota,s_kill);                 // Destruye los procesos antiguos
  687.     signal(TYPE nave,s_kill);
  688.     signal(TYPE porterias,s_kill);
  689.     signal(TYPE objetos,s_kill);
  690.     signal(TYPE objetosmarcador,s_kill);
  691.     signal(TYPE sombra,s_kill);
  692.     delete_text(idtexto);                       // Borra el texto
  693.     iniciacampo();                              // Y crea objetos nuevos
  694.     fade_on();                                  // Enciende la pantalla
  695. END
  696.  
  697. //------------------------------------------------------------------------------
  698. // Proceso explosión
  699. // Imprime las explosiones cuando hay un choque
  700. //------------------------------------------------------------------------------
  701.  
  702. PROCESS explosión (x,y)
  703.  
  704. BEGIN
  705.     ctype=c_scroll; // Introduce al proceso dentro del scroll
  706.     flags=4;        // Transparente
  707.     graph=51;       // Elige el gráfico
  708.     z=-40;          // lo pone por encima
  709.     WHILE (graph<58) graph++; FRAME; END    // Realiza la animación
  710. END
  711.  
  712. //------------------------------------------------------------------------------
  713. // Proceso marcadores
  714. // Imprime los fondos de los marcadores
  715. //------------------------------------------------------------------------------
  716.  
  717. PROCESS marcadores()
  718.  
  719. BEGIN
  720.     x=320;              // Selecciona coordenadas
  721.     y=20;
  722.     graph=60;           // Pone el fondo del marcador de tiempo
  723.     z=-1;
  724.     CLONE               // Crea otro marcador
  725.         graph=59;       // Pone el fondo de marcador del jugador 1
  726.         x=76;           // Cambiando la posición y el gráfico
  727.         CLONE           // Crea otro marcador
  728.             x=564;      // El del jugador 2 cambiando la posición
  729.         END
  730.     END
  731.     LOOP FRAME; END
  732. END
  733.  
  734. //------------------------------------------------------------------------------
  735. // Proceso iniciacampo
  736. // Reinicializa todos los procesos
  737. //------------------------------------------------------------------------------
  738.  
  739. PROCESS iniciacampo()
  740.  
  741. BEGIN
  742.     SWITCH (modojuego)      // Inicia el juego dependiendo de los jugadores
  743.  
  744.         CASE 0:             // Jugador 1 contra jugador 2
  745.             define_region(1,0,0,319,480);       // Define dos regiones de pantalla
  746.             define_region(2,322,0,319,480);
  747.             start_scroll(0,0,idestadio,0,2,0);  // Y dos movimientos de las mismas
  748.             start_scroll(1,0,idestadio,0,1,0);
  749.             idpelota0=pelota();                 // Crea la pelota
  750.             idnave1=nave(qjugador1);            // Y las dos naves
  751.             idnave2=nave(qjugador2);
  752.             scroll[0].camera=idnave1;           // Hace que las cámaras sigan a las naves
  753.             scroll[1].camera=idnave2;
  754.         END
  755.         CASE 1:             // Jugador 1 contra ordenador
  756.             start_scroll(0,0,idestadio,0,0,0);  // Crea el movimiento de pantalla
  757.             idpelota0=pelota();                 // Crea la pelota
  758.             idnave1=nave(qjugador1);            // Y las dos naves
  759.             idnave2=nave(qjugador2);
  760.             scroll[0].camera=idnave1;           // Hace que la cámara siga al jugador
  761.         END
  762.         CASE 2:     // Ordenador contra jugador 2
  763.             start_scroll(0,0,idestadio,0,0,0);  // Crea el movimiento de pantalla
  764.             idpelota0=pelota();                 // Crea la pelota
  765.             idnave1=nave(qjugador1);            // Y las dos naves
  766.             idnave2=nave(qjugador2);
  767.             scroll[0].camera=idnave2;           // Hace que la cámara siga al jugador
  768.         END
  769.         CASE 3:     // Ordenador contra ordenador
  770.             start_scroll(0,0,idestadio,0,0,0);  // Crea el movimiento de pantalla
  771.             idpelota0=pelota();                 // Crea la pelota
  772.             idnave1=nave(qjugador1);            // Y las dos naves
  773.             idnave2=nave(qjugador2);
  774.             scroll[0].camera=idpelota0;         // Hace que la cámara siga a la pelota
  775.         END
  776.     END
  777.     porterías();            // Crea las porterías
  778.     objetosmarcador();      // Y los fondos de los marcadores
  779.  
  780. END
  781.  
  782. //------------------------------------------------------------------------------
  783. // Proceso porterías
  784. // Imprime las porterías que se imprimen encima
  785. //------------------------------------------------------------------------------
  786.  
  787. PROCESS porterías ()
  788.  
  789. BEGIN
  790.     ctype=c_scroll; // Introduce al proceso dentro del scroll
  791.     z=-50;
  792.     x=77;           // Selecciona las coordenadas y el gráfico
  793.     y=477;
  794.     graph=61;       // Elige el gráfico y crea la portería izquierda
  795.     CLONE           // Crea otra portería, la de la derecha
  796.         graph=62;   // Cambiando las coordenadas y el gráfico
  797.         x=1122;
  798.         y=478;
  799.     END
  800.     LOOP FRAME; END
  801.  
  802. END
  803.  
  804. //------------------------------------------------------------------------------
  805. // Proceso sombra
  806. // Maneja las sombras de las naves
  807. //------------------------------------------------------------------------------
  808.  
  809. PROCESS sombra()
  810.  
  811. BEGIN
  812.     ctype=c_scroll; // Introduce al proceso dentro del scroll
  813.     x=father.x;     // Coge las coordenadas del proceso que los llamo
  814.     y=father.y;
  815.     flags=4;        // Lo hace transparente
  816.     z=1;
  817.     graph=63;               // Elige el gráfico
  818.     LOOP
  819.         x=father.x;
  820.         y=father.y;         // Sigue al proceso que lo llamo
  821.         angle=father.angle; // Coge el ángulo del padre
  822.         FRAME;
  823.     END
  824. END
  825.  
  826. //------------------------------------------------------------------------------
  827. // Proceso objetos
  828. // Controla los objetos de los bonus
  829. //------------------------------------------------------------------------------
  830.  
  831. PROCESS objetos ()
  832.  
  833. PRIVATE
  834.     tipobonus;          // Tipo del bonus: 0-> Puntos
  835.                         //                 1-> Mejor control
  836.                         //                 2-> Mas fuerza de empuje
  837.                         //                 3-> Para a la otra nave
  838.     graficoinicio;      // Gráfico de inicio del objeto
  839.     idnave;             // Identificador de las naves
  840. BEGIN
  841.     ctype=c_scroll;     // Hace que el proceso tenga las coordenadas respecto al scroll
  842.     z=10;
  843.     file=fichero2;      // Elige el fichero de los gráficos
  844.     tipobonus=rand(0,3);// Y un bonus al azar
  845.     sibonus=1;
  846.     graph=(tipobonus*8)+1;  // Selecciona el gráfico dependiendo del tipo de bonus
  847.     graficoinicio=graph;    // Inicializa el gráfico del objeto
  848.     REPEAT                  // Espera a que no se ponga encima de nada
  849.         x=rand(142,1057);
  850.         y=rand(206,747);
  851.     UNTIL (NOT collision(TYPE nave) AND NOT collision (TYPE pelota))
  852.     size=0;
  853.     timer[1]=0;                             // Pone el contador de tiempo a 0
  854.     WHILE (timer[1]<1500)                   // Lo tiene en pantalla 15 segundos
  855.         IF (size<100) size+=5; END          // Hace que aparezca agrandándose
  856.         angle+=5000;                        // Lo gira a cada paso
  857.         graph++;                            // Realiza la animacion1
  858.         IF (graph>graficoinicio+7) graph=graficoinicio; END
  859.         FRAME;
  860.         IF (idnave=collision(TYPE nave))    // Mira si ha chocado con una nave
  861.             sound(idspuntos,100,256);
  862.             timer[2]=0;
  863.             explosión(x,y);
  864.             idnave.bonus=tipobonus+1;       // Actualiza la variables bonus de las naves
  865.             IF (idnave.cual==jugador1 OR idnave.cual==ordenador1)
  866.                 idnave2.bonus=0;
  867.             ELSE
  868.                 idnave1.bonus=0;
  869.             END
  870.             SWITCH (tipobonus)              // Mira que tipo de bonus es
  871.                 CASE 0:                     // Da puntos
  872.                     IF (idnave.cual==jugador1 OR idnave.cual==ordenador1)
  873.                         puntos1+=10;
  874.                     ELSE
  875.                         puntos2+=10;
  876.                     END
  877.                     tiempobonus=100;        // Dura un segundo el efecto
  878.                     break;
  879.                 END
  880.                 CASE 1:                     // Hace que se controle mejor la nave
  881.                     idnave.vmaxima=3000;    // Mayor velocidad
  882.                     idnave.aceleración=800; // Mas aceleración
  883.                     idnave.frenada=1600;    // Mas frenada
  884.                     tiempobonus=500;        // Dura 5 segundos
  885.                     break;
  886.                 END
  887.                 CASE 2:                     // Hace que la fuerza de empuje sea mayor
  888.                     idnave.fuerzaotra=2000;
  889.                     tiempobonus=1500;       // Dura 15 segundos
  890.                     break;
  891.                 END
  892.                 CASE 3:                     // Para a la otra nave
  893.                     IF (idnave.cual==jugador1 OR idnave.cual==ordenador1)
  894.                         signal(idnave2,s_freeze);
  895.                     ELSE
  896.                         signal(idnave1,s_freeze);
  897.                     END
  898.                     tiempobonus=200;        // Dura dos segundos
  899.                     break;
  900.                 END
  901.             END
  902.         END
  903.     END
  904.     explosión(x,y);     // Si el icono desaparece realiza una explosión
  905.     sibonus=0;          // Lo deja preparado para que aparezcan más bonus
  906. END
  907.  
  908. //------------------------------------------------------------------------------
  909. // Proceso objetosmarcador
  910. // Controla los objetos cogidos que están ya en el marcador
  911. //------------------------------------------------------------------------------
  912.  
  913. PROCESS objetosmarcador()
  914.  
  915. PRIVATE
  916.     iniciografico;      // Gráfico inicial del objeto
  917.     ultimoobjeto1=0;    // Ultimo objeto recogido por el jugador de la izquierda
  918.     ultimoobjeto2=0;    // Ultimo objeto recogido por el jugador de la derecha
  919.     idnave;             // Identificador de la nave
  920.     tipobonus;          // Tipo de bonus cogido
  921.  
  922. BEGIN
  923.     z=-10; y=20;        // Selecciona algunas variables y el fichero de gráficos
  924.     file=fichero2;
  925.     LOOP
  926.         // Mira si lo a cogido el jugador de la izquierda
  927.         IF (idnave1.bonus<>0 AND idnave1.bonus<>ultimoobjeto1)
  928.             iniciografico=((idnave1.bonus-1)*8)+1;
  929.             graph=iniciografico;
  930.             x=177;
  931.             ultimoobjeto1=idnave1.bonus;
  932.             ultimoobjeto2=0;
  933.             timer[2]=0;
  934.         END
  935.  
  936.         // Mira si lo ha cogido el jugador de la derecha
  937.         IF (idnave2.bonus<>0 AND idnave2.bonus<>ultimoobjeto2)
  938.             iniciografico=((idnave2.bonus-1)*8)+1;
  939.             graph=iniciografico;
  940.             x=463;
  941.             ultimoobjeto2=idnave2.bonus;
  942.             ultimoobjeto1=0;
  943.             timer[2]=0;
  944.         END
  945.  
  946.         // Si lo tiene alguien anima el gráfico
  947.         IF (idnave1.bonus<>0  OR idnave2.bonus<>0)
  948.             graph++;
  949.             IF (graph>iniciografico+7) graph=iniciografico; END
  950.         END
  951.         FRAME;
  952.  
  953.         // Comprueba que no ha pasado el tiempo de efecto y que hay bonus
  954.         IF (timer[2]>tiempobonus AND tiempobonus<>-1)
  955.             tiempobonus=-1;
  956.             IF (idnave1.bonus<>0)
  957.                 idnave=idnave1;
  958.             ELSE
  959.                 idnave=idnave2;
  960.             END
  961.             tipobonus=(idnave.bonus)-1;
  962.             SWITCH (tipobonus)          // Quita el efecto del bonus
  963.                 CASE 0:     // Reinicializa variables
  964.                     idnave.bonus=0;
  965.                     timer[2]=0;         // Reinicia tiempo
  966.                     graph=0;            // Quita gráfico
  967.                 END
  968.                 CASE 1:     // Pone velocidad, frenada y aceleración como estaban
  969.                     idnave.vmaxima=2000;
  970.                     idnave.aceleración=400;
  971.                     idnave.frenada=800;
  972.                     idnave.bonus=0;
  973.                     timer[2]=0;         // Reinicia tiempo
  974.                     graph=0;            // Quita gráfico
  975.                 END
  976.                 CASE 2:     // Deja la fuerza de choque a cero
  977.                     idnave.fuerzaotra=0;
  978.                     idnave.bonus=0;
  979.                     timer[2]=0;         // Reinicia tiempo
  980.                     graph=0;            // Quita gráfico
  981.                 END
  982.                 CASE 3:     // Hace que la otra nave se mueva
  983.                     IF (idnave.cual==jugador1 OR idnave.cual==ordenador1)
  984.                         signal(idnave2,s_wakeup);
  985.                     ELSE
  986.                         signal(idnave1,s_wakeup);
  987.                     END
  988.                     idnave.bonus=0;
  989.                     timer[2]=0;         // Reinicia tiempo
  990.                     graph=0;            // Quita gráfico
  991.                 END
  992.             END
  993.         END
  994.    END
  995. END
  996.  
  997. //------------------------------------------------------------------------------
  998. // Proceso creditos
  999. // Pone los creditos del programa y sale del juego
  1000. //------------------------------------------------------------------------------
  1001.  
  1002. PROCESS creditos()
  1003.  
  1004. PRIVATE
  1005.     idfondo;    // Identificador del gráfico de fondo
  1006.  
  1007. BEGIN
  1008.     // Elimina cualquier proceso o texto que hubiera
  1009.     let_me_alone();
  1010.     delete_text(all_text);
  1011.  
  1012.     // Carga la pantalla de fondo con su paleta y la pone en pantalla
  1013.     idfondo=load_map("heliobal\creditos.map");
  1014.     load_pal("heliobal\creditos.map");
  1015.     put_screen(0,idfondo);
  1016.  
  1017.     // Escribe los textos de los creditos
  1018.     write(fuente4,320,45,4,"PROGRAMADOR:");
  1019.     write(fuente4,320,90,4,"ANTONIO MARCHAL.");
  1020.  
  1021.     write(fuente4,320,145,4,"GRAFICOS POR:");
  1022.     write(fuente4,320,190,4,"JOSE FERNANDEZ");
  1023.     write(fuente4,320,230,4,"RAFAEL BARRASO");
  1024.  
  1025.     write(fuente4,320,290,4,"SONIDOS:");
  1026.     write(fuente4,320,335,4,"ANTONIO MARCHAL");
  1027.     fade_on();  // Enciende la pantalla
  1028.  
  1029.     // Espera hasta que se pulse una tecla
  1030.     scan_code=0;
  1031.     WHILE (scan_code==0)
  1032.         FRAME;
  1033.     END
  1034.     fade_off(); // Apaga la pantalla
  1035.     exit("Gracias por jugar!",0);   // Sale del programa
  1036. END
  1037.  
  1038. //------------------------------------------------------------------------------
  1039. // Proceso barra_menu
  1040. // Imprime las barras de las barras del menu...
  1041. // Entradas: Variables predefinidas del sistema
  1042. //------------------------------------------------------------------------------
  1043.  
  1044. PROCESS barra_menu(x,y,graph,file,flags,z)
  1045.  
  1046. BEGIN
  1047.     LOOP
  1048.         FRAME;
  1049.     END
  1050. END
  1051.